package dao;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Vector;

import javax.swing.JOptionPane;

import metier.Film;
import metier.Horaire;
import metier.Salle;
import metier.Seance;
import metier.Tarif;

public class DaoProjetCinema
{	
	// Partie SEANCE
	public static Vector <Seance> getLesSeance()
	{
	
		Connection connect = null;
		String req, req2;
		Statement stLienBd = null;
		Statement stReq2 = null;
		ResultSet resultat, resultat2;
		Film unFilm = null;
		Seance uneSeance = null;
		Salle uneSalle;
		Tarif unTarif;
		Horaire unHoraire;
		Vector <Seance> lesSeances;
		
		lesSeances = new Vector <Seance>();
			
		connect = MySqlConnection.getConnection("projet_cinema","root","");
			
		req = "SELECT * FROM Film";
			
		try
		{
			stLienBd = connect.createStatement();
			resultat = stLienBd.executeQuery(req);
			stReq2 = connect.createStatement();
			
			while (resultat.next())
			{
//				/* A FAIRE : Variable à instancier et à compléter */	
				req2 = "SELECT * FROM Film, Tarif, Salle, Horaire, Seance WHERE Seance.numSalle = Salle.numSalle AND Seance.numFilm = Film.numFilm AND Seance.numTarif = Tarif.numTarif AND Seance.heure = Horaire.heure AND Seance.minutes = Horaire.minutes";
				System.out.println(req2);
				resultat2 = stReq2.executeQuery(req2);
				while(resultat2.next())
				{
					/* A FAIRE : Variable à ajouter et à compléter */	
					unFilm = new Film(resultat2.getInt(1), resultat2.getString(2), resultat2.getInt(3), resultat2.getDate(4), resultat2.getInt(5));
					unTarif = new Tarif(resultat2.getInt(6), resultat2.getString(7), resultat2.getFloat(8));
					uneSalle = new Salle(resultat2.getInt(9), resultat2.getInt(10));
					unHoraire = new Horaire(resultat2.getInt(11), resultat2.getInt(12));
					uneSeance = new Seance(resultat2.getInt(13), resultat2.getString(14), resultat2.getDate(15), resultat2.getInt(16), uneSalle, unFilm, unHoraire, unTarif);
				}
				/* A FAIRE : Variable à ajouter et à compléter */
				unFilm.ajouterSeance(uneSeance);
				lesSeances.add(uneSeance);
			}
			resultat.close();
			connect.close();
		} 
		catch (SQLException e)
		{
			System.out.println("pas de résultat" + e.getMessage());
		}
		return lesSeances;	
	}
	
	public static int ajouterSeance(Seance uneSeance, Salle uneSalle, Tarif unTarif, Film unFilm, Horaire unHoraire)
	{
		String req;

		req = "Insert into SEANCE values(null, " + uneSalle.getNumSalle() + ", " + unTarif.getNumTarif() + ", " + unFilm.getNumFilm() + ", " + unHoraire.getHeure() + ", " + unHoraire.getMinute() + 
				", '" + uneSeance.getJour() + "', '" + uneSeance.getDateSeance() + "', " + uneSeance.getNbPlacesAchetees() + ")";
		System.out.println(req);
		return MySqlFramework.executerMaj(req);
	}
	
	
	// Partie TARIF
	public static Vector <Tarif> getLesTarif()
	{
		String req;
		Vector <Tarif> lesTarifs;
		ResultSet res;
		Tarif leTarif;
		
		lesTarifs = new Vector <Tarif>();
		req = "select * from TARIF";
		res = MySqlFramework.executerLecture(req);
		//res = OracleFramework.executerLecture(req);
		// Parcours du résultat de la requête
		try
		{
			while (res.next())
			{	
				leTarif = new Tarif(res.getInt(1), res.getString(2), res.getDouble(3));
				lesTarifs.add(leTarif);
			}
			res.close();
		}
		catch (Exception e)
		{
			JOptionPane.showMessageDialog(null, e.getMessage());
		}		
		// Fermeture de la connexion
		MySqlConnection.close();
		//OracleConnection.close();
		return lesTarifs;
	}
	
	public static int ajouterTarif(Tarif unTarif)
	{
		String req;

		req = "Insert into TARIF values(null, '" + unTarif.getLibTarif() + "', " + unTarif.getPrix() +")";
		return MySqlFramework.executerMaj(req);
	}
	
    public static int modifierTarif(Tarif unTarif)
    {
        String req = "update Tarif set numTarif ='"+ unTarif.getNumTarif()+"', libTarif='"+unTarif.getLibTarif()+"', prix='"+unTarif.getPrix()+ "' where numTarif="+unTarif.getNumTarif();
        System.out.println(req);
        return MySqlFramework.executerMaj(req);
    }
	
    public static int supprimerTarif(Tarif unTarif)
    {
            String req;
            req = "DELETE FROM film WHERE numFilm = " + unTarif.getNumTarif();
            return MySqlFramework.executerMaj(req);
    }

	
	// Partie FILM
	public static Vector <Film> getLesFilm()
	{
		String req;
		Vector <Film> lesFilms;
		ResultSet res;
		Film leFilm;
		
		lesFilms = new Vector <Film>();
		req = "select * from FILM";
		res = MySqlFramework.executerLecture(req);
		//res = OracleFramework.executerLecture(req);
		// Parcours du résultat de la requête
		try
		{
			while (res.next())
			{	
				leFilm = new Film(res.getInt(1), res.getString(2), res.getInt(3), res.getDate(4), res.getInt(5));
				lesFilms.add(leFilm);
			}
			res.close();
		}
		catch (Exception e)
		{
			JOptionPane.showMessageDialog(null, e.getMessage());
		}		
		// Fermeture de la connexion
		MySqlConnection.close();
		//OracleConnection.close();
		return lesFilms;
	}

	public static int ajouterFilm(Film unFilm)
	{
		String req;

		// pour MySQL :
		req = "Insert into FILM values(null, '" + unFilm.getTitreFilm() + "', " + unFilm.getDureeFilm() + ", '" + unFilm.getDateSortie() + "', " + unFilm.getNbSemaine() +")";
		return MySqlFramework.executerMaj(req);
		
		// pour Oracle :
		//req = "Insert into FILM values(" + unFilm.getTitreFilm() + ", " + unFilm.getDureeFilm() + ", " + dateOracle(unFilm.getDateSortie()) + ", " + unFilm.getNbSemaine() +")";
		//return OracleFramework.executerMaj(req);
	}
	
    public static int modifierFilm(Film unFilm)
    {
        String req = "update film set numFilm ='"+ unFilm.getNumFilm()+"', TitreFilm='"+unFilm.getTitreFilm()+"', DureeFilm='"+unFilm.getDureeFilm()+"', DateSortie='"+unFilm.getDateSortie()+"', nbSemaine='"+unFilm.getNbSemaine()+"' where numFilm="+unFilm.getNumFilm();
        System.out.println(req);
        return MySqlFramework.executerMaj(req);
    }
		
	public static int supprimerFilm(Film unFilm)
    {
            String req;
            req = "DELETE FROM film WHERE numFilm = " + unFilm.getNumFilm();
            return MySqlFramework.executerMaj(req);
    }

	
	// Partie HORAIRE
	public static Vector <Horaire> getLesHoraire()
	{
		String req;
		Vector <Horaire> lesHoraires;
		ResultSet res;
		Horaire leHoraire;
		
		lesHoraires = new Vector <Horaire>();
		req = "select * from HORAIRE";
		res = MySqlFramework.executerLecture(req);
		//res = OracleFramework.executerLecture(req);
		// Parcours du résultat de la requête
		try
		{
			while (res.next())
			{	
				leHoraire = new Horaire(res.getInt(1), res.getInt(2));
				lesHoraires.add(leHoraire);
			}
			res.close();
		}
		catch (Exception e)
		{
			JOptionPane.showMessageDialog(null, e.getMessage());
		}		
		// Fermeture de la connexion
		MySqlConnection.close();
		//OracleConnection.close();
		return lesHoraires;
	}
	
	
	// Partie SALLE
	public static Vector <Salle> getLesSalle()
	{
		String req;
		Vector <Salle> lesSalles;
		ResultSet res;
		Salle laSalle;
		
		lesSalles = new Vector <Salle>();
		req = "select * from SALLE";
		res = MySqlFramework.executerLecture(req);
		//res = OracleFramework.executerLecture(req);
		// Parcours du résultat de la requête
		try
		{
			while (res.next())
			{	
				laSalle = new Salle(res.getInt(1), res.getInt(2));
				lesSalles.add(laSalle);
			}
			res.close();
		}
		catch (Exception e)
		{
			JOptionPane.showMessageDialog(null, e.getMessage());
		}		
		// Fermeture de la connexion
		MySqlConnection.close();
		//OracleConnection.close();
		return lesSalles;
	}
		
	public static int ajouterSalle(Salle uneSalle)
	{
		String req;

		req = "Insert into SALLE values(null, " + uneSalle.getNbPlacesTotales() +")";
		return MySqlFramework.executerMaj(req);
	}
	    
    public static int modifierSalle(Salle uneSalle)
    {
        String req = "update Salle set numSalle ='"+ uneSalle.getNumSalle()+"', nbPlacesTotales='"+uneSalle.getNbPlacesTotales();
        System.out.println(req);
        return MySqlFramework.executerMaj(req);
    }
	
    public static int supprimerSalle(Salle uneSalle)
    {
            String req;
            req = "DELETE FROM Salle WHERE numSalle = " + uneSalle.getNumSalle();
            return MySqlFramework.executerMaj(req);
    }
	
	
	// Méthode utilisée seulement pour les bases Oracle
	private static String dateOracle(java.util.Date date)
	{
		String d = date.getDate() + "/" + (date.getMonth()+1) + "/" + (date.getYear()+1900);
		System.out.println(d);
	
		return d;
	}
}